# FontForge と TeX

FontForge には、TeX を取り扱うための多数の機能が組み込まれています。

“pk”形式と“gf”形式のビットマップを読み込むことができ、それらに autotrace を適用してアウトラインフォントを生成することができます。 “.mf”ファイルに metafont を直接呼び出して“gf”ビットマップを生成し、autotrace にかけてアウトラインフォントを出力することさえ可能です。

合字とカーニングの情報を“.tfm”ファイルから読み込むことができます。 TFM ファイルを作成することもできます。

エンコーディング ファイルには、多数の標準 TeX エンコーディングが組み込まれています。

大規模な CJK の TrueType フォントに対しては、ttf2tfm のマニュアルページで手議されているとおりのサブフォント定義ファイルを読み込むことができ、この 2 つのファイルを元に一揃いの PostScript Type 1 フォントを 出力 することができます。

Lilypond 開発者グループと協議して、TeX 固有の情報を True/OpenType ファイルに格納する SFNT テーブル‘TeX’ を新たに設計しました。

### TFM ファイル (と ENC ファイル) を出力する方法

TFM ファイルを出力する前に、以下の手順のいくつかを実行しなければなりません。

フォントのパラメータを設定する
  これは、`エレメント(L)`→`フォント情報(F)...`→`[ΤεΧ]` で行います。
必要に応じて、グリフのイタリック補正値を入力する
  (FontForge はイタリックフォントに対してデフォルトの値を生成しますので、この作業は、FontForge の見積りが間違っているときのみ行えば十分です)
  - イタリック補正を含むべきグリフを選択する
  - `エレメント(L)`→`グリフ情報(I)...→`[選択型の置換]` タブを選ぶ`
  - `[新規(N)]` を押す
  - プルダウンリスト `タグ(T)` で `イタリック補正` を選ぶ
  - イタリック補正値を `ΔXadvance` に入力する
必要に応じて、何らかの TeX グリフリストを設定する
  - TeX 文字リストに含める最初の文字 (コードが最小の文字) をセレクトする
  - `エレメント(L)`→`文字情報(I)`→`[別の位置]` タブを選ぶ
  - `[新規(N)...]` を押す
  - プルダウンリスト `タグ(T)` で `TeXグリフリスト` を選ぶ
  - 例えば、左括弧に対する文字リストの場合:
    グリフ lparen を選択し、“`lparen.big lparen.bigger lparen.biggest`”と打ち込むことになる。
必要に応じて、何らかの拡張文字を設定する
  - そのグリフが TeX グリフリストに存在する場合、グリフリストの最後のグリフ (インデックスが最大の文字) をセレクトする
  - `エレメント(L)`→`文字情報(I)`→`[複数の置換先]` タブを選ぶ
  - `[新規(N)]` を押す
  - プルダウンリスト `タグ(`T`)` で `TeX拡張リスト` を選ぶ
  - この文字が分解される各グリフの名前を、以下の順番で入力する:
    上部、中央、下部、拡張
    フィールドが存在しない場合、.notdef を使用する
    例えば、左括弧に対応する拡張リストの場合: lparen.biggest を選択し、“`lparen.top lparen.mid lparen.bottom lparen.ext`" と入力することになる。

注意: FontForge が `ファイル(F)`→`カーニング情報の統合(M)` を TFM ファイルに対して行った場合、これらの値は適切に設定されます。

満足の行くまでこれを行ったならば、TFM ファイルを出力する準備ができています。 `ファイル(F)`→`フォントを出力(G)` で出てくるプルダウンリストから PostScript エンコーディングのどれか 1 つを選び、`[オプション]` ボタンを押して `[*]TFMとENCを出力` チェックボックスをオンにします。

あなたがこれらのファイルを使って何を行うのか筆者は完全に理解していませんが、それらはこの手順で作成できるでしょう。

### TeX に Type1 (PFB) PostScript フォントをインストールする方法

筆者は初心者の TeX/LaTeX ユーザなので、コメントは眉に唾をつけて読んでください。 手元のシステムではこの手順で動かすことに成功しました。

PostScript フォントを TeX にインストールするのは予想よりずっと複雑です (そのため、私はラテン文字のフォントをインストールする方法しか説明できません)。 フォントファイルを単に標準ディレクトリに移動するだけではなく以下のことをしなければなりません:

- <TeX をローカルな追加に対応できるように設定しておく>
- フォントファイルの名前を TeX が理解可能なフォーマットに変更する
  (これは不要だと聞いたのですが、この手順抜きではうまく動きませんでした。 筆者のシステムが古いのか、正しい手順を踏んでいないのだと思います)
- TeX が自分の目的のために使ういくつかのヘルパーファイルを作成する
- ファイルをそれぞれのファイルタイプごとに専用のディレクトリに移動する
- 必要に応じて: LaTeX がフォントを見つけやすくするためのパッケージファイルを作成する
- 必要に応じて: パッケージファイルをそれ自身のディレクトリに移動する
- updmap スクリプトを使用するか手動で以下を行う:
  - dvips の設定ファイルを更新し、PostScript フォントを探す場所を知らせる
  - 必要に応じて、PdfTeX の設定ファイルも更新し、フォントを探す場所を知らせる

この先を読む前に、web 上の以下のリソースを参照することをお奨めします:

- 自作フォントを TeX の標準ディレクトリ構造に追加することも可能ですが、これを行うと TeX のアップグレードが難しくなるので、TeX グルの顰蹙をかうでしょう。 彼らは、それと同じディレクトリ階層を別の場所に作って TeX フォントとディレクトリに関するインストール上の助言 にあるように指定することを進めるでしょう。 彼らは、より詳しく説明されたフォントのインストールの例を the LaTeX font-faq で提供しています。
- 古いバージョンの TeX (例えば筆者のシステム) は、いまだに昔の DOS ファイル名の 8 文字制限を気にかけます。 つまり、筆者が使ったツールは TeX font file naming conventions の記述に従わないファイル名を理解しません。 自作フォントの場合、一言で言えばこういうことです:
  - フォントの最初の文字は“f”にします (これは、フォントが有名なフォントベンダ製のものではないことを意味します)
  - 続く 2 文字はあなたのフォントのファミリー名を表す特定の略称です。
  - 続く 1〜2 文字は、ローマン体のフォントには“r”, イタリックには“i”, オブリークには“o”, ボールドには“b”, ボールドイタリックには“bi”をつけます。
  - 最後の 2 文字は“8a”とします (これは、フォントが Adobe 標準エンコーディングであるということであり、作成するフォントは必ずこのエンコーディングでなければなりません。そうでないと動きません)
    (付言すると、どんなエンコーディングでも、きちんと登録すれば TeX で使えるようになると聞きました。これはうまく動きませんでしたが、筆者のシステムが旧式の物だからでしょう)
- 最後に the LaTeX font-faq はフォントのインストールをどう押し進めるかについての血まみれの細部について語っています。 唯一の (些細な) 難点は、インストールするフォントが Adobe 製であると仮定していることです。 以下の点に注意すれば読み替えることは簡単です:
  - Adobe 製フォントは“f”ではなく“p”で始まる名前をつけることになっています。
  - Adobe のフォントファミリー名から 2 文字の略称への変換規則は既に存在しており、Adobe フォントを使う時はその表からファミリー名を探して 2 文字の略称を得ます。 自作のフォントファミリーを作る時は自分で決めます。
  - Adobe 用のベンダディレクトリは“adobe”ですが、自作フォント用のベンダディレクトリは“public”になるでしょう。
  - (上のリンク先を読むときに、このコメントが役に立てば幸いです)
- TrueType フォントが使えるかを筆者は試してみていませんが、その点についていくつかの情報がこの文書にはあります。LaTeX と TTF
- 基礎的な事柄に興味がある人には、ここに fontinst のドキュメンテーションそのものがあります。
- 筆者は、キリル文字やギリシャ文字、CJK のフォントをどう扱うかについてはまだ知りません (キリル文字の T2 エンコーディングは 6a と言うことだけは知っています)。
- インストールされたフォントをどう使うかについていくつかの情報があります。 LaTeX とフォント

筆者は以下のようにしました:

- Installation advice にあるとおりにディレクトリ構造を作りました (これは the LaTeX font-faq にもあります)。
- フォントを作り (Cupola という名前です), まずこれを TeX ベースエンコーディングでエンコードしました (これは、必要な全ての文字を作ったことを確認するためです)
- フォントの生成を行う直前に、これを Adobe 標準エンコーディングでエンコードし直しました (TeX の fontinst ルーチンがそう仮定しているからです)
- フォントを“fcur8a.pfb”という名前で出力しました。意味は以下のとおりです:
  - f ― 小さなフォントベンダの製品やパブリックドメインのフォントなど
  - cu ― ファミリー名“Cupola”の略称
  - r ― ローマン体
  - 8a ― Adobe 標準エンコーディング
- 以下のスクリプトを実行しました:

  >     #!/bin/bash
  >     # 以下の 2 行はあなたの作るフォントに合わせて修正する必要があるでしょう。
  >     # その後ろの 2 行も変更したいかもしれません。
  >     BASE=fcu
  >     PACKAGE=cupola
  >     VENDOR=public
  >     LOCALTEXMF=/usr/local/share/texmf

  >     # 後で混乱の元になりそうなファイルが元からあれば全て削除します
  >     csh -c "rm fi.tex *.mtx *.pl *.vpl"

  >     # TeX が必要とする各種のファイルを生成できるように、小さなスクリプトを作成します
  >     echo "\\input fontinst.sty" >fi.tex
  >     echo "\\latinfamily{$BASE}{}" >>fi.tex
  >     echo "\\bye" >>fi.tex

  >     # そのスクリプトを実行します
  >     tex fi

  >     # しかし、これらのファイルはちょっと追加の加工を行う必要があります
  >     for file in *.pl ; do
  >     pltotf $file
  >     done
  >     for file in *.vpl ; do
  >     vptovf $file
  >     done

  >     # もう必要でなくなったゴミを削除します
  >     rm fi.tex *.mtx *.pl *.vpl

  >     # さまざまなコンポーネントが必要とするディレクトリを作成します
  >     mkdir -p $LOCALTEXMF/fonts/type1/$VENDOR/$PACKAGE \
  >     	$LOCALTEXMF/fonts/afm/$VENDOR/$PACKAGE \
  >     	$LOCALTEXMF/fonts/tfm/$VENDOR/$PACKAGE \
  >     	$LOCALTEXMF/fonts/vf/$VENDOR/$PACKAGE \
  >     	$LOCALTEXMF/tex/latex/$VENDOR/$PACKAGE

  >     # 全ての物をあるべきディレクトリに置きます
  >     cp $BASE*.pfb $LOCALTEXMF/fonts/type1/$VENDOR/$PACKAGE
  >     cp $BASE*.afm $LOCALTEXMF/fonts/afm/$VENDOR/$PACKAGE
  >     mv $BASE*.tfm $LOCALTEXMF/fonts/tfm/$VENDOR/$PACKAGE
  >     mv $BASE*.vf $LOCALTEXMF/fonts/vf/$VENDOR/$PACKAGE
  >     mv *$BASE*.fd $LOCALTEXMF/tex/latex/$VENDOR/$PACKAGE

  >     # 最後にこのフォントの LaTeX パッケージを作成し (て、正しい場所に置き) ます
  >     echo "\\ProvidesPackage{$PACKAGE}" > $LOCALTEXMF/tex/latex/$VENDOR/$PACKAGE/$PACKAGE.sty
  >     echo "\\renewcommand{\\rmdefault}{$BASE}" >> $LOCALTEXMF/tex/latex/$VENDOR/$PACKAGE/$PACKAGE.sty
  >     echo "\\endinput" >> $LOCALTEXMF/tex/latex/$VENDOR/$PACKAGE/$PACKAGE.sty
  >     # しかし map ファイルの更新にはこのスクリプトが知っているよりちょっと余分に
  >     # 知識が必要です。筆者はこれを手動で行ってもらうことにしました
  >     echo "*********************************************************************"
  >     echo あなたは自分のマップファイルを作成する必要があります。
  >     echo 一つは $LOCALTEXMF/dvips/config/$BASE.map という名前で、ファミリーに
  >     echo "含まれる各フォントを列挙した 1 行からなります 以下のような感じです:"
  >     echo "${BASE}r8a $PACKAGE-Regular \"TexBase1Encoding ReEncodeFont\" <8r.enc <${BASE}r8a.pfb"
  >     echo それから config.ps ファイルで標準のマップファイルを定義している場所を
  >     echo 探して、その後ろを以下のように書き換えてください:
  >     echo "p +$BASE.map"
  >     echo それから $LOCALTEXMF/pdftex/config/ に移動し、
  >     echo $LOCALTEXMF/dvips/config/$BASE.map をコピー "(またはリンク)" して
  >     echo pdftex.cfg を編集し、これも同様に
  >     echo "p +$BASE.map"
  >     echo という記述を適切な場所に追加してください。

― 前 ― 目次 ― 次 ―